<?php
class Relatorio extends CI_Controller {

	public function index()
	{
		redirect('relatorio/listar');
	}

	public function listar()
	{
		$dados = array();

		$this->template->add_js('assets/js/sistema/relatorio/listar.js');
		$this->template->add_js('assets/js/datatables/jquery.dataTables.js');
		$this->template->add_js('assets/js/datatables/jquery.sortable.js');
		$this->template->write_view('content', 'relatorio/listar_view', $dados);
		$this->template->render();
	}

	public function sql($id = 'novo')
	{
		$dados = array();
		$dados['acao'] = 'Cadastrar';

		if ($id !== 'novo' && $id > 0) {

			$dados['acao'] = 'Editar';

			$this->db->select("rl_id, rl_nome, rl_status, rl_sql");
			$this->db->from("relatorio");
			$this->db->where("rl_id = $id");

			$dados['relatorio'] = $this->db->get()->row();
		} else {
			$dados['relatorio']->rl_id = 0;
			$dados['relatorio']->rl_nome = '';
			$dados['relatorio']->rl_sql = '';
		}

		$this->template->add_js('assets/js/sistema/relatorio/listar.js');
		$this->template->add_js('assets/js/datatables/jquery.dataTables.js');
		$this->template->add_js('assets/js/datatables/jquery.sortable.js');
		$this->template->add_js('assets/js/sistema/relatorio/sql.js');
		$this->template->write_view('content', 'relatorio/sql_view', $dados);
		$this->template->render();
	}

	public function executar_sql($id) {
		$this->db->select("rl_id, rl_nome, rl_status, rl_sql");
		$this->db->from("relatorio");
		$this->db->where("rl_id = $id");

		$dados['relatorio'] = $this->db->get()->row();

		$padrao = $this->_monta_padrao_filtro($dados['relatorio']->rl_sql);

		$dados['layout_relatorio'] = $this->_monta_campo_relatorio($padrao);

		$this->template->add_js('assets/js/sistema/relatorio/executar_sql.js');
		$this->template->write_view('content', 'relatorio/executar_sql_view', $dados);
		$this->template->render();

	}

	public function ajax_gerar_campos($id_relatorio) {

		$this->db->select("rl_sql");
		$this->db->from("relatorio");
		$this->db->where("rl_id = $id_relatorio");
		$relatorio = $this->db->get()->row();

		$padrao = $this->_monta_padrao_filtro($relatorio->rl_sql);

		echo $this->_monta_campo_relatorio($padrao, $id_relatorio);
	}

	private function _monta_padrao_filtro($string_sql)
	{
		// Pega toda a string sql para quebrar
		$filtro = array();
		// preg_match("/<@sql.*@>/", $string_sql, $filtro);
		preg_match_all("/<@sql.*?@>/", $string_sql, $filtro);
		// $filtro = preg_split("/<@sql.*@>/", $string_sql);

		// Agora eu tiro as minhas tags padrão <@sql @>
		$padrao = array();
		for ($i = 0; $i < count($filtro[0]); $i++) {
			$pattern = array('<@sql', '@>');
			// $novo_filtro = preg_replace("/[<@sql@>]/", "", $filtro[0][$i]);
			$novo_filtro = str_replace($pattern, "", $filtro[0][$i]);

			parse_str($novo_filtro, $padrao[$i]);
		}

		return $padrao;
	}

	private function _monta_campo_relatorio($campos, $id_relatorio)
	{
		$layout = '<form method="post" action="javascript:void(0)" onsubmit="executar_filtro(this)">'
			.'<input type="hidden" name="id_relatorio_filtro" value="'.$id_relatorio.'" />';
		$layout .= '<table class="formulario relatorio">';

		$largura_td = 'width="300"';

		// Percorro o array com o campos para montar o layout do formulario
		for ($i = 0; $i < count($campos); $i++) {

			$layout .= '<tr>';

			$nome_campo = trim($campos[$i]['nome']);
			$label_campo = trim($campos[$i]['label']);

			// Variavel para o campo vir com um valor padrão
			$preenchimento_campo = '';
			if (isset($campos[$i]['padrao']) && (trim($campos[$i]['padrao']) == 's')) {
				$preenchimento_campo = 'checked="checked"';
			}

			switch (trim($campos[$i]['tipo'])) {
				case 'data':
					$layout .= '<td '.$largura_td.'>'.$label_campo.'</td>';
					$layout .= '<td><input type="text" name="'.$nome_campo.'" class="datepicker" /></td>';
					break;
				case 'checkbox':
					$layout .= '<td '.$largura_td.'>'.$label_campo.'</td>';
					$valores_check = $this->_monta_check_radio($campos[$i]['filtro'], $nome_campo, $campos[$i]['tipo'], $preenchimento_campo);

					$layout .= '<td>'
						.'<fieldset>'
							.'<legend><input type="checkbox" onclick="check_all(this)" '.$preenchimento_campo.' /></legend>'
							.$valores_check
						.'</fieldset>'
					.'</td>';

					break;
				case 'credor':
					$layout .= '<td '.$largura_td.'>'.$label_campo.'</td>';
					$check_credor = $this->mget_credor_checkbox($nome_campo);
					// $layout .= '<td>'.$check_credor.'</td>';
					$layout .= '<td>'
						.'<fieldset>'
							.'<legend><input type="checkbox" onclick="check_all(this)" /></legend>'
							.$check_credor
						.'</fieldset>'
					.'</td>';
					break;
				default:
					$layout .= '<td '.$largura_td.'>'.$label_campo.'</td>';
					$layout .= '<td><input type="text" name="'.$nome_campo.'" /></td>';
					break;
			}

			$layout .= '</tr>';
		}

		$layout .= '<tr>'
			.'<td colspan="2">'
				.'<button type="submit">Executar filtro</button>'
			.'</td>'
		.'</tr>';
		$layout .= '</table></form>';

		return $layout;
	}

	private function _monta_check_radio($parametro, $nome_campo, $tipo, $preenchimento_campo) {
		// Se for checkbox
		$check = '';
		if ($tipo == 'checkbox') {

			foreach($parametro as $valor => $label) {
				$check .= '<label class="checkbox"><input type="checkbox" value="'.trim($valor).'" name="'.$nome_campo.'[]" '.$preenchimento_campo.' />'.$label.'</label>';
			}
		}

		return $check;
	}

	public function ajax_executar_filtro() {
		$this->load->helper('string');
		parse_str($_POST['dados_form'], $_POST);

		$resp = array();

		$this->db->select("rl_sql");
		$this->db->from("relatorio");
		$this->db->where("rl_id = " . $this->input->post('id_relatorio_filtro'));
		$relatorio = $this->db->get()->row();

		// Aqui vai substitui a sql pelo parametro do filtro
		// Chamo a função novamente para saber qual o nome dos campos que estão sendo passados
		$campos_filtro = $this->_monta_padrao_filtro($relatorio->rl_sql);

		$new_sql = $relatorio->rl_sql;
		for ($i = 0; $i < count($campos_filtro); $i++) {
			$nome = trim($campos_filtro[$i]['nome']);
			$valor = $_POST[$nome];

			// Se o valor for um array transformo em uma string
			if (is_array($valor)) {
				$count = 0;
				$new_valor = '';
				foreach ($valor as $val) {
					if ($count === 0) {
						$new_valor .= "'".$val."'";
					} else {
						$new_valor .= ',' . "'".$val."'";
					}
					$count++;
				}
				$valor = $new_valor;
			}

			// Tem que remover as aspas duplas
			$new_sql = str_replace('"', '', trim(preg_replace("/<@sql.*(\b".$nome."\b).*?@>/", $valor, $new_sql)));
		}

		$resp['resultado'] = $this->monta_tabela($new_sql);
		$resp['sql_gerada'] = $new_sql;

		echo json_encode($resp);
	}

	public function executar_filtro() {

		// Aqui vai substitui a sql pelo parametro do filtro
		// Chamo a função novamente para saber qual o nome dos campos que estão sendo passados
		$campos_filtro = $this->_monta_padrao_filtro($_POST['txt_sql']);

		// Percorre o array para substituir o valor que o cara passou pelo nome do campo
		$new_sql = $_POST['txt_sql'];
		for ($i = 0; $i < count($campos_filtro); $i++) {
			$nome = trim($campos_filtro[$i]['nome']);
			$valor = $_POST[$nome];
			$new_sql = preg_replace("/<@sql.*(\b".$nome."\b).*?@>/", $valor, $new_sql);
		}

		$tabela_resultado = $this->monta_tabela($new_sql);

		echo $tabela_resultado;
	}

	public function ajax_cadastrar_sql() {

		parse_str($_POST['dados_form'], $_POST);

		$resp = array(
			'erro' => 0,
			'msg' => '',
			'id' => 0
		);

		$dados = array(
			'rl_nome' => $_POST['txt_nome_relatorio'],
			'rl_sql' => $_POST['txt_sql']
		);

		if ($this->input->post('id_relatorio')) {
			// Edição
			$this->db->update('relatorio', $dados, 'rl_id = ' . $this->input->post('id_relatorio'));
			$resp['id'] = $this->input->post('id_relatorio');
		} else {
			$this->db->insert('relatorio', $dados);
			$resp['id'] = $this->db->insert_id();
		}

		$resp['msg'] = '<div class="alert alert-success">Operação realizada com sucesso. Cadastrar outro filtro SQL?</div>';

		echo json_encode($resp);
	}

	public function monta_tabela($sql) {

		$this->load->library('table');

		$tmpl = array('table_open' => '<table id="resultado_filtro_sql">');
		$this->table->set_template($tmpl);
		$query = $this->db->query($sql);

		return $this->table->generate($query);
	}

	public function ajax_buscar_relatorios()
	{
		$this->lang->load('status');
		$icon_status = $this->lang->line('status');

		$limite = $this->input->post('iDisplayLength');
		$start  = $this->input->post('iDisplayStart');
		$sort   = $this->input->post('iSortCol_0');
		$order  = $this->input->post('sSortDir_0');

		switch ($sort) {
			case 1:
				$sort_field = 'rl_id';
				break;
			default:
				$sort_field = 'rl_id';
				break;
		}

		$this->db->select("rl_id, rl_nome, rl_sql, rl_status, rl_descricao");
		$this->db->from("relatorio");

		$total = $this->db->count_all_results();

		$this->db->order_by("$sort_field $order");
		$this->db->limit($limite, $start);
		$results = $this->db->get()->result();

		$resp['iTotalRecords']        = $total;
		$resp['iTotalDisplayRecords'] = $total;

		$resp['aaData'] = array();
		$indice = 0;
		foreach ($results as $row)
		{
			$j = 0;

			$resp['aaData'][$indice][$j++] = '<label><input type="checkbox" name="check_iten[]" value="'.$row->rl_id.'" /></label>';
			$resp['aaData'][$indice][$j++] = $row->rl_id;
			$resp['aaData'][$indice][$j++] = $row->rl_nome;
			$resp['aaData'][$indice][$j++] = $row->rl_descricao;
			$resp['aaData'][$indice][$j++] = $icon_status[$row->rl_status] . '<a href="'.site_url().'/relatorio/sql/'.$row->rl_id.'"><i class="fugue-magnifier-medium-left" title="Visualizar filtro sql"></i></a>';

			$indice++;
		}

		echo json_encode($resp);
	}

	/*============ Esses serão feito no model*/
	public function mget_credor_checkbox($nome_checkbox, $extra = '') {

		$this->db->select("cr_id, cr_nome");
		$this->db->from("credor");
		$this->db->order_by("cr_nome ASC");

		$query = $this->db->get();

		$check = '';

		foreach($query->result() as $row) {
			$check .= '<label><input type="checkbox" value="'.$row->cr_id.'" name="'.$nome_checkbox.'[]" />' . $row->cr_nome . '</label>';
		}

		return $check;
	}

}